package com.ycq;

import com.ycq.parser.QuestionCenterDomScanner;
import com.ycq.parser.QuestionNode;
import com.ycq.parser.attribute.AttributeKey;
import com.ycq.parser.node.RadioQuestionNode;
import com.ycq.parser.node.ShareOptionsNode;
import com.ycq.parser.node.ShareQuestionNode;
import org.apache.poi.xwpf.usermodel.*;

import java.io.IOException;
import java.util.*;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) throws IOException {

//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第一章 呼吸系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第二章 循环系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第三章 消化系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第四章 泌尿系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第五章 妇产科系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第六章 儿科系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第七章 血液系统120.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第八章 内分泌系统120.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第九章 精神神经系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第十章 运动系统及风湿病240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第十一章 其他系统240.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\第十三章 中医系统120.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第十四章 病理学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第十五章 药理学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第十六章 预防医学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第十八章 卫生法.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第十九章 心理学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十章 伦理学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十一章 生理.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十二章  生物化学.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十三章 解剖（助理不考）.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十四章 病理生理学（助理不考）.docx";
//        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十五章 微生物学（助理不考）.docx";
        String filePath = "D:\\Resources\\二试题\\《国家医师资格考试执业（含助理）历年优质考题精编 3000 题》\\基础题1.0\\第二十六章 免疫学（助理不考）.docx";

        QuestionCenterDomScanner questionCenterDomScanner = new QuestionCenterDomScanner(filePath);
        questionCenterDomScanner.addSkipRows("以下内容助理不考");
        questionCenterDomScanner.addSkipRows("以下为助理不考");
        questionCenterDomScanner.addSkipRows("以下助理不考");
        questionCenterDomScanner.addSkipRows("以下为精神病学部分");
        questionCenterDomScanner.addSkipRows("【B1型题】");//

        List<QuestionNode> list = new ArrayList<>();
        while (true){
            Optional<QuestionNode> questionNodeOptional = questionCenterDomScanner.scanNext();
            if(!questionNodeOptional.isPresent()){
                break;
            }
            QuestionNode questionNode = questionNodeOptional.get();
            // 校验结果，是否包含答案
            if(questionNode instanceof ShareQuestionNode){
                ShareQuestionNode shareQuestionNode = (ShareQuestionNode) questionNode;
                if(shareQuestionNode.getRadioQuestionNodes() == null || isBlank(shareQuestionNode.getQuestion())){
                    throw new RuntimeException("共享题干问题格式错误 \n context = \n"+String.join("\n",shareQuestionNode.getRawLines()));
                }
                for (RadioQuestionNode radioQuestionNode : shareQuestionNode.getRadioQuestionNodes()) {
                    String ANSWERS = radioQuestionNode.getAttribute(AttributeKey.ANSWERS);
                    if(isBlank(ANSWERS)){
                        throw new RuntimeException("共享题干问题选项格式错误,没有包含答案 \n context = \n"+String.join("\n",radioQuestionNode.getRawLines()));
                    }
                    for (String questionOption : radioQuestionNode.getQuestionOptions()) {
                        if(!isLetter(questionOption.charAt(0))){
                            throw new RuntimeException("选择题选项格式错误,没有英文开头 \n context = \n"+String.join("\n",radioQuestionNode.getRawLines()));
                        }
                    }
                }
            }else if(questionNode instanceof RadioQuestionNode){
                RadioQuestionNode radioQuestionNode = (RadioQuestionNode) questionNode;
                for (String questionOption : radioQuestionNode.getQuestionOptions()) {
                    if(!isLetter(questionOption.charAt(0))){
                        throw new RuntimeException("选择题选项格式错误,没有英文开头 \n context = \n"+String.join("\n",radioQuestionNode.getRawLines()));
                    }
                }
            }else if(questionNode instanceof ShareOptionsNode){
                ShareOptionsNode shareOptionsNode = (ShareOptionsNode) questionNode;
                for (String questionOption : shareOptionsNode.getQuestionOptions()) {
                    if(!isLetter(questionOption.charAt(0))){
                        throw new RuntimeException("共享选项格式错误,没有英文开头 \n context = \n"+String.join("\n",shareOptionsNode.getRawLines()));
                    }
                }
            }
            list.add(questionNode);
        }

        System.out.println();
    }

    private static boolean isBlank(String answers) {
        return answers == null || answers.trim().isEmpty();
    }

    private static boolean isLetter(char c) {
        return (c>='A' && c<='Z')||(c>='a'&&c<='z');
    }
}